package com.firewolf.solr.s01_helloworld;

import java.util.Date;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Before;
import org.junit.Test;

/**
 * 增删改查
 * 
 * @author liuxing
 *
 */
public class Crud {

	private HttpSolrClient client = null;

	@Before
	public void init() {
		// 获取solr连接，mycore1是集合名
		client = new HttpSolrClient("http://localhost:8081/solr/mycore1");
		System.out.println(client);
	}

	/**
	 * 新增
	 */
	@Test
	public void add() throws Exception {
		// 构建要添加的文档
		SolrInputDocument doc = new SolrInputDocument();
		doc.addField("id", "g1_001");
		doc.addField("title_s", "mytitle");
		doc.addField("des_s", "first description");
		doc.addField("on_dt", new Date());
		// 添加
		client.add(doc);
		// 提交
		client.commit();
	}

	/**
	 * 查询
	 * 
	 * @throws Exception
	 */
	@Test
	public void query() throws Exception {
		SolrQuery query = new SolrQuery();
		String qStr = "name_s:wangwu OR socre_i:85 ";// 查询字符串
		query.setQuery(qStr);
		// 分页，如果没有分页，就会返回所有
		// query.setStart(1);
		// query.setRows(2);
		// query.set("sort", "socre_i asc"); //排序，多个之间使用逗号连接
		QueryResponse response = client.query(query);
		SolrDocumentList list = response.getResults();
		for (SolrDocument s : list) {
			System.err.println(s.getFieldValue("socre_i"));
		}
	}

	/**
	 * 查询条件测试
	 * 
	 * @throws Exception
	 */
	@Test
	public void query2() throws Exception {
		SolrQuery q = new SolrQuery();
		q.set("q", "*:*");// q选项，设置查询字符串，如果想根据某个字段值查询，可以写：age:23这种
		q.set("fl", "socre_i,name_s"); // fl选项：指定要返回的字段名，多个之间使用逗号连接，不设置会查询全部
		QueryResponse response = client.query(q);
		SolrDocumentList list = response.getResults();
		for (SolrDocument s : list) {
			System.err.println(s.getFieldValue("name_s") + "," + s.getFieldValue("socre_i"));
		}
	}

	/**
	 * 删除： 1、可以根据ID删除（可以一次删除一个，也可以删除多个）； 2、可以根据查询条件删除。
	 * 
	 * @throws Exception
	 */
	@Test
	public void delete() throws Exception {
		// client.deleteById(Arrays.asList("change.me","123456"));
		client.deleteById("123456");
		client.deleteByQuery("id:change.me");
		client.commit();// 提交
		query();
	}

	/**
	 * 修改和新增是使用一样的函数，直接覆盖
	 * 
	 * @throws Exception
	 */
	@Test
	public void update() throws Exception {
	}

}
